home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Medal Software 3
/
Gold Medal Software - Volume 3 (Gold Medal) (1994).iso
/
prog
/
word.arj
/
MOVEOBJ.C
< prev
next >
Wrap
Text File
|
1992-06-09
|
3KB
|
85 lines
/* Rotates and moves polygon-based objects (only balls, at the moment). */
#include "polygon.h"
#define X_BALL_MOVE 1.0
#define Y_BALL_MOVE 1.0
#define Z_BALL_MOVE 20.0
void RotateAndMoveBall(PObject * ObjectToMove)
{
/* Change the spin axis from X to Y or Y to X if requested by the user */
if (BallEvent & FLIP_SPIN_AXIS) {
if (ObjectToMove->Rotate.RotateX != 0) {
ObjectToMove->Rotate.RotateX = 0;
ObjectToMove->Rotate.RotateY = 100; /* 10 degree Y rotations */
} else if (ObjectToMove->Rotate.RotateY != 0) {
ObjectToMove->Rotate.RotateY = 0;
ObjectToMove->Rotate.RotateZ = 50; /* 5 degree Z rotations */
} else {
ObjectToMove->Rotate.RotateZ = 0;
ObjectToMove->Rotate.RotateX = 75; /* 1.6 degree X rotations */
}
BallEvent &= ~FLIP_SPIN_AXIS;
}
/* Rotate the ball as needed */
if (--ObjectToMove->RDelayCount == 0) { /* rotate */
ObjectToMove->RDelayCount = ObjectToMove->RDelayCountBase;
if (ObjectToMove->Rotate.RotateX != 0)
AppendRotationX(ObjectToMove->XformToWorld,
ObjectToMove->Rotate.RotateX);
if (ObjectToMove->Rotate.RotateY != 0)
AppendRotationY(ObjectToMove->XformToWorld,
ObjectToMove->Rotate.RotateY);
if (ObjectToMove->Rotate.RotateZ != 0)
AppendRotationZ(ObjectToMove->XformToWorld,
ObjectToMove->Rotate.RotateZ);
ObjectToMove->RecalcXform = 1;
}
/* Move the ball in response to recorded key events */
if (BallEvent & MOVE_LEFT) {
if (ObjectToMove->XformToWorld[0][3] > DOUBLE_TO_FIXED(-15000.0)) {
ObjectToMove->XformToWorld[0][3] -= DOUBLE_TO_FIXED(X_BALL_MOVE);
ObjectToMove->RecalcXform = 1;
}
BallEvent &= ~MOVE_LEFT;
}
if (BallEvent & MOVE_RIGHT) {
if (ObjectToMove->XformToWorld[0][3] < DOUBLE_TO_FIXED(15000.0)) {
ObjectToMove->XformToWorld[0][3] += DOUBLE_TO_FIXED(X_BALL_MOVE);
ObjectToMove->RecalcXform = 1;
}
BallEvent &= ~MOVE_RIGHT;
}
if (BallEvent & MOVE_UP) {
if (ObjectToMove->XformToWorld[1][3] < DOUBLE_TO_FIXED(15000.0)) {
ObjectToMove->XformToWorld[1][3] += DOUBLE_TO_FIXED(Y_BALL_MOVE);
ObjectToMove->RecalcXform = 1;
}
BallEvent &= ~MOVE_UP;
}
if (BallEvent & MOVE_DOWN) {
if (ObjectToMove->XformToWorld[1][3] > DOUBLE_TO_FIXED(-15000.0)) {
ObjectToMove->XformToWorld[1][3] -= DOUBLE_TO_FIXED(Y_BALL_MOVE);
ObjectToMove->RecalcXform = 1;
}
BallEvent &= ~MOVE_DOWN;
}
if (BallEvent & MOVE_TOWARD) {
if (ObjectToMove->XformToWorld[2][3] < DOUBLE_TO_FIXED(-100.0)) {
ObjectToMove->XformToWorld[2][3] += DOUBLE_TO_FIXED(Z_BALL_MOVE);
ObjectToMove->RecalcXform = 1;
}
BallEvent &= ~MOVE_TOWARD;
}
if (BallEvent & MOVE_AWAY) {
if (ObjectToMove->XformToWorld[2][3] > DOUBLE_TO_FIXED(-15000.0)) {
ObjectToMove->XformToWorld[2][3] -= DOUBLE_TO_FIXED(Z_BALL_MOVE);
ObjectToMove->RecalcXform = 1;
}
BallEvent &= ~MOVE_AWAY;
}
}